/*
Copyright (C) 2008 raohmaru <http://www.raohmaru.com>

This file is part of Raohmaru AS3 Framework.

Raohmaru AS3 Framework is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Raohmaru AS3 Framework is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with Raohmaru AS3 Framework.  If not, see <http://www.gnu.org/licenses/>.
*/

package jp.raohmaru.events 
{
import flash.events.Event;

/**
 * La clase CollectionEvent representa un evento que es distribuido cuando el objeto Collection asociado es modificado.
 * Incluye los siguientes tipos:
<ul>
	<li><code>CollectionEvent.COLLECTION_CHANGE</code>: se distribuye cuando se realiza un cambio en los elementos de la colección.</li>
	<li><code>CollectionEvent.COLLECTION_ADD</code>: se distribuye cuando se añade un elemento a la colección.</li>
	<li><code>CollectionEvent.COLLECTION_REMOVE</code>: se distribuye cuando se elimina un elemento de la colección.</li>
	<li><code>CollectionEvent.COLLECTION_REPLACE</code>: se distribuye cuando se reemplaza un elemento de la colección.</li>
</ul>  
 * @see jp.raohmaru.collections.Collection
 * @author raohmaru
 * @version 1.0
 * @source Basado en la clase mx.events.CollectionEvent de Adobe <http://livedocs.adobe.com/flex/3/langref/mx/events/CollectionEvent.html>
 */
public class CollectionEvent extends Event 
{
	/**
	 * Define el valor de la propiedad <code>type</code> para un objeto de evento <code>collectionChange</code>. 
	 */
	public static const COLLECTION_CHANGE :String = "collectionChange";
	/**
	 * Define el valor de la propiedad <code>type</code> para un objeto de evento <code>collectionAdd</code>. 
	 */
	public static const COLLECTION_ADD :String = "collectionAdd";
	/**
	 * Define el valor de la propiedad <code>type</code> para un objeto de evento <code>collectionRemove</code>. 
	 */
	public static const COLLECTION_REMOVE :String = "collectionRemove";
	/**
	 * Define el valor de la propiedad <code>type</code> para un objeto de evento <code>collectionReplace</code>. 
	 */
	public static const COLLECTION_REPLACE :String = "collectionReplace";
	
	
	private var _position :int,
				_items :Array;
				
	/**
	 * Obtiene el valor del índice de la colección donde se ha efectuado una modificación.
	 */
	public function get position() :int
	{
		return _position;
	}
	
	/**
	 * Una matriz que contiene los elementos añadidos, eliminados o reemplazados del objeto Collection.
	 */
	public function get items() :Array
	{
		return _items;
	}
	
				
	/**
	 * Crea un nuevo objeto CollectionEvent con los parámetros especificados.
	 * @param type Tipo de evento; este valor identifica la acción que ha activado el evento.
	 * @param position El valor del índice de la colección donde se ha efectuado una modificación.
	 * @param items Una matriz que contiene los elementos modificados del objeto Collection.
	 */
	public function CollectionEvent(type :String, position :int, items :Array)
	{
		_position = position;		_items = items;
		
		super(type, bubbles, cancelable);
	}
	
	/**
	 * Devuelve una cadena con todas las propiedades del objeto CollectionEvent.
	 * La cadena tiene el siguiente formato:
	 * 
	 * <p>[<code>CollectionEvent type=<em>value</em> position=<em>value</em>
	 * items=<em>value</em> cancelable=<em>value</em> 
     * bubbles=<em>value</em></code>]</p>
	 *
     * @return Una representación de cadena del objeto DragEvent
	 */
	override public function toString() :String 
	{
		return formatToString("CollectionEvent", "type", "position", "items", "bubbles", "cancelable");
	}

	/**
	 * Crea una copia del objeto CollectionEvent y define el valor de cada parámetro para que coincida con el original.
     * @return Copia de la instancia de CollectionEvent actual.
	 */
	override public function clone() :Event
	{
		return new CollectionEvent(type, _position, _items);
	}
}
}
